<?php

namespace app\logic\push;

use app\model\MessageClient AS ModelMessageClient;
use app\model\MessageContent as ModelMessageContent;

class Push
{
    protected $arr_client = ['user' => '用户端', 'courier' => '快递端', 'driver' => '司机端', 'stationapp' => "站点APP端", 'stationpc' => '站点PC端'];


    public $arr_client_key = [];

    public function __construct()
    {
        $this->arr_client_key = array_keys($this->arr_client);
    }

    /**
     * 获取数据结构
     * @param $int_type
     * @param $int_id
     * @param $str_url
     * @param $str_prepare
     * @param $str_content
     * @param array $arr_data
     * @return string
     */
    public function rules($int_type, $int_id, $str_url, $str_prepare, $str_content, $arr_data = [])
    {
        /**
         * 1 打开详情页（系统消息）
         * 2 打开url地址(H5)(系统消息、个人消息)
         * 3 打开详情页（个人消息）
         * 4 借款申请通知（无详情）
         *
         * 1 — 打开详情页（系统消息）使用id字段的值去请求 《获取系统消息详情(无需登录)》接口
         * 2 — 打开url地址(H5)(系统消息、个人消息)   使用url字段的值去跳转
         * 3 — 打开详情页（个人消息）使用id字段的值去请求 《获取活动系统消息详情(必需登录)》接口
         * 4 — 弹窗显示-使用content字段的值去展示
         */
        return json_encode([
            'type' => intval($int_type),
            'id' => strval($int_id),
            'url' => $str_url,
            'prepare' => $str_prepare,
            'content' => $str_content,
            'data' => (object)$arr_data,
        ], JSON_UNESCAPED_UNICODE);
    }

    /**
     * 推送通知消息给用户
     * @param string $str_client 客户端名称
     * @param string $str_map_id 用户编号
     * @param string $str_title 标题
     * @param string $str_desc 推送标题(描述)
     * @param string $json_params 推送的数据
     * @return bool
     */
    public function pushNoticeMessageToUser($str_client, $str_map_id, $str_title, $str_desc, $json_params)
    {
        $arr_params = (array)json_decode($json_params, true);
        if (isset($arr_params['type']) && $arr_params['type'] == 3) {
            $int_message_id = ModelMessageContent::getInstance()->toAdd([
                'title' => $str_title,
                'desc' => $str_desc,
                'content' => $arr_params['content'],
            ]);
            unset($json_params);
            $json_params = $this->rules(3, $int_message_id, '', '', $arr_params['content']);
        }

        return $this->pushMessageToUser($str_client, $str_map_id, 'all', 1, $str_title, $str_desc, $json_params, 1, 1, '0000-00-00 00:00:00', 0, 0);
    }

    /**
     * 发送推送消息给用户（透传和消息栏展示都有）
     * @param string $str_client 客户端名称
     * @param string $str_map_id 用户编号 多个用,隔开
     * @param string $str_platform 平台名称 all-所有 android-安卓 ios-苹果
     * @param int $int_is_push 是否已经推送 0-未推送 1-已推送
     * @param string $str_title 标题
     * @param string $str_desc 推送标题(描述)
     * @param string $json_params 推送的数据
     * @param int $int_is_show 是否展示 0-不展示、1-展示、2-预约时间到就展示
     * @param $int_release_status
     * @param string $str_subscribe_time 预约时间
     * @param int $int_pass_through 是否未透传 0-否 1-是
     * @param int $int_message_id 消息编号
     * @return bool
     */
    protected function pushMessageToUser($str_client, $str_map_id, $str_platform, $int_is_push, $str_title, $str_desc, $json_params, $int_is_show, $int_release_status, $str_subscribe_time, $int_pass_through, $int_message_id = 0)
    {
        $arr_passport = [];

        $arr_add_data = [];

        $arr_map_id = explode(',', $str_map_id);
        $obj_passport = new \app\logic\Passport($str_client);
        $int_i = 0;
        foreach ($arr_map_id as $value) {
            $str_passport = $obj_passport->getNewPassport(intval($value));
            if (is_string($str_passport)) {
                $arr_add_data[$int_i] = [
                    'message_id' => 0,
                    'client' => $str_client,
                    'title' => $str_title,
                    'desc' => $str_desc,
                    'passport' => $str_passport,
                    'map_id' => $value,
                    'release_status' => $int_release_status,
                    'subscribe_time' => $str_subscribe_time,
                    'params' => $json_params,
                    'is_show' => $int_is_show,
                ];
                $int_i++;
                $arr_passport[] = $str_passport;
            }
            unset($str_passport);
        }
        unset($value);

        if (empty($arr_passport)) return false;

        if ($int_message_id > 0) {
            foreach ($arr_add_data as &$value) {
                $value['message_id'] = $int_message_id;
            }
            unset($value);
        }

        if ($int_is_push == 1) {
            $obj = new PushMessage(config('mipush.' . $str_client));

            if ($int_pass_through == 1) {
                $obj->dataPassThrough($arr_passport, $json_params, $str_desc);
            } else {
                $obj->sendMessageToUser($str_platform, $arr_passport, $str_title, $str_desc, $json_params, 0);
            }
        }

        ModelMessageClient::getInstance()->toAddAll($arr_add_data);

        return true;
    }
}
